<?php

class Jhg_Helper_Auth extends Zend_Controller_Action_Helper_Abstract {
    const authTable = 'users';
    const loginColumn = 'login';
    const passwColumn = 'passw';
    const hashFunc = 'md5';

    const statusInactive = 0;
    const statusActive = 1;
    const statusCancelled = 2;

    private $config;
    private $redirector;

    public function init() {
        $this->config = Zend_Controller_Action_HelperBroker::getStaticHelper('config');
        $this->redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
    }

    public function tryAuthenticate($username, $password, & $outErrorMessage) {
        // фильтруем запрос
        $f = new Zend_Filter_StripTags();
        $username = $f->filter($username);

        if (empty($username)) {
            $outErrorMessage = 'Введите имя пользователя';
            return false;
        }

        $password = $f->filter($password);
        $password = call_user_func(self::hashFunc, $password);

        return $this->authenticate($username, $password, $outErrorMessage);
    }

    public function tryAuthenticateDbRow($username, $password, & $outErrorMessage) {
        return $this->authenticate($username, $password, $outErrorMessage);
    }
    
    private function authenticate($username, $password, & $outErrorMessage) {

        $authAdapter = new Zend_Auth_Adapter_DbTable(Zend_Registry::get('db'));
        $authAdapter->setTableName(self::authTable);
        $authAdapter->setIdentityColumn(self::loginColumn);
        $authAdapter->setCredentialColumn(self::passwColumn);

        // передаем адаптеру данные
        $authAdapter->setIdentity($username);
        $authAdapter->setCredential($password);

        // производим авторизацию
        $auth = Zend_Auth::getInstance();
        $result = $auth->authenticate($authAdapter);
        if ($result->isValid()) {
            // успех: записываем инфу в сессию, кроме пороля
            $data = $authAdapter->getResultRowObject(null, self::passwColumn);
//            if (self::statusInactive == $data->status) {
//                $outErrorMessage = 'Пользователь не активирован';
//                Zend_Auth::getInstance()->clearIdentity();
//                return false;
//            }
//            if (self::statusCancelled == $data->status) {
//                $outErrorMessage = 'Аккаунт отменен';
//                Zend_Auth::getInstance()->clearIdentity();
//                return false;
//            }
            $data->time = time();
            $auth->getStorage()->write($data);
            return true;
        }
        // иначе: выводим сообщение
        $outErrorMessage = 'Неверные имя пользователя и (или) пароль';
        return false;
    }

}